package com.thread;

import lombok.extern.slf4j.Slf4j;

import static java.lang.Thread.sleep;

/**
 * 默认情况下，java进程需要等待所有的线程结束，程序才会结束运行
 * 而有一种线程比较特殊：守护线程 daemon
 * 一旦其他非守护线程运行结束，守护线程也会结束运行，无论其中的代码是否运行完毕
 * 应用场景：垃圾回收器线程就是一种守护线程
 * Tomcat中的Acceptor和Poller线程都是守护线程，所以当Tomcat收到shutDown命令后，不会等待它们处理完当前请求
 * 可以运行以下代码观察一下控制台输出，感受一下守护线程dameon
 */
@Slf4j
public class MainThreadAndDaemonThread {
    public static void main(String[] args) throws InterruptedException {
        testDaemon();
    }

    public static void testDaemon() throws InterruptedException {
        log.debug("main开始运行");
        Thread t1 = new Thread(() -> {
            log.debug("t1开始运行...");
            try {
                sleep(2);
                log.debug("t1运行结束...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t1");
        t1.setDaemon(true);//t1线程设置为守护线程
        t1.start();
        sleep(1);
        log.debug("main运行结束...");
    }
}
